//快速排序  ----思想基于分治
//1.  取出分界点  q[l] 、q[(l+r)/2]、  q[r]、  随机  等四种方法
//2.  通过分界点进行调整
//3.  递归处理左右两段
// 一般的数据容器就是  列表 和 vector  和  数组
//  第二步的处理方法就是 	用额外的空间来保存两个  大于  小于 的段
//  						第二种方法就是利用双指针 从两端开始往里面扫
//							

//YXC版本
#include <iostream>
using namespace std;
const int N=1e6+10;

int n;
int q[N];

void quick_sort(int q[],int l,int r){
    if(l>=r) return ;
    int x=q[r],i=l-1,j=r+1;
    while(i<j) {
        do i++;while(q[i]<x);
        do j--;while(q[j]>x);
        if(i<j) swap(q[i],q[j]);
    }
    quick_sort(q,l,i-1);
    quick_sort(q,i,r);
}

int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%d",&q[i]);
    quick_sort(q,0,n-1);
    for(int i=0;i<n;i++) printf("%d ", q[i]);
    return 0;
}


// 左神版本


#include <iostream>
#include <vector>

using namespace std;
const int N=1e6+10;

int n;
int q[N];

vector<int> p(2,0);
void  partition(int q[],int l,int r){
    int less=l-1;
    int more=r;
    while(l<more){
        if(q[l]<q[r]) swap(q[++less],q[l++]);
        else if(q[l]>q[r]) swap(q[--more],q[l]);
        else l++;
    }
    swap(q[more],q[r]);
    p[0]=less+1;p[1]=more;
    return;
}

void quick_sort(int q[],int l,int r){
    if(l<r){
        partition(q,l,r);
        quick_sort(q,l,p[0]-1);
        quick_sort(q,p[1]+1,r);
    }
}


int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%d",&q[i]);
    quick_sort(q,0,n-1);
    for(int i=0;i<n;i++) printf("%d ", q[i]);
    return 0;
}

